/*
http://c.biancheng.net/view/7125.html
https://blog.csdn.net/u013581207/article/details/97611921

 %--通配符
 $@--目标文件
 $^--所有的依赖文件
 $<--第一个依赖文件。

 make -p 可以查看所有预定义的变量的当前值。
*/
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>

/*
     va_list p;
     va_start(p, fmt);
     va_arg(p, int);
     va_end(p);
*/


struct dog{
    int age;      // 4
    char *name;   // 4
    int height;   // 4
    char type;    // 1
}__attribute__((packed));

struct cat{
    int age;
    char *name;
    int height;
    char type;
}__attribute__((aligned(4)));


void print_test(const char *format, ...)
{
    va_list vap;
    va_start(vap, format);

    printf("&format=%p, format=%p \r\n", &format, format); // 也可以写 %#X 或 %#x
    printf("arg1 %c %c %c \r\n", *format, *(format+1), *(format+2)); 

    int i = va_arg(vap,int);
    printf("arg2 %d \r\n", i); 

    char *s = va_arg(vap,char*);
    printf("arg3 %s \r\n", s); 

    i = va_arg(vap,int);
    printf("arg4 %d \r\n", i); 

    struct dog pd = va_arg(vap, struct dog); // 注意这里
    printf("arg5 age:%d,  height:%d,  name:%s \r\n", pd.age,  pd.height, pd.name);

    char ch = va_arg(vap,int); // 注意这里
    printf("arg5 %c \r\n", ch); 

    double d = va_arg(vap,double);
    printf("arg5 %f \r\n", d); 

    va_end(vap);
}


int main(int argc, char *argv[])
{
    struct dog d = {10, "tom", 20, 'd'};

    printf("sizeof(char*)=%d\r\n", sizeof(char*));
    printf("sizeof(int)=%d\r\n", sizeof(int));
    
    printf("sizeof(dog)=%d\r\n", sizeof(struct dog));
    printf("sizeof(cat)=%d\r\n", sizeof(struct cat));

    print_test("format %s %d", 123, "bcd", 678, d,'m', 2.79);

     return EXIT_SUCCESS;
}